package cn.zy.gvs.v1.task;

import cn.zy.gvs.v1.model.GoViewProject;
import cn.zy.gvs.v1.model.SysFile;
import cn.zy.gvs.v1.service.IGoViewProjectService;
import cn.zy.gvs.v1.service.ISysFileService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 第一位，表示秒，取值0-59
 * 第二位，表示分，取值0-59
 * 第三位，表示小时，取值0-23
 * 第四位，日期天/日，取值1-31
 * 第五位，日期月份，取值1-12
 * 第六位，星期，取值1-7，1表示星期天，2表示星期一
 * 第七位，年份，可以留空，取值1970-2099
 *
 * @author yann
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class FileCleanTask {

    private final IGoViewProjectService goViewProjectService;

    private final ISysFileService sysFileService;

    private final FileStorageService fileStorageService;

    private static final String PREVIEW = "%s_index_preview.png";

    /**
     * 定时清理多余文件
     * 每周二 1:00 执行一次
     */
    @Scheduled(cron = "0 0 1 * * 2")
    public void clean() {

        List<GoViewProject> projectList = goViewProjectService.list();
        for (GoViewProject goViewProject : projectList) {
            log.debug("^_^ 开始清理项目 - [{}]多余图片文件...", goViewProject.getProjectName());
            List<SysFile> fileList = sysFileService.list(Wrappers.<SysFile>lambdaQuery()
                    .eq(SysFile::getOriginalName, String.format(PREVIEW, goViewProject.getId()))
                    .ne(SysFile::getUrl, goViewProject.getIndexImage())
                    .orderByDesc(SysFile::getCreateTime));

            log.debug("^_^ 项目 - [{}] 总共产生了 {} 个多余预览文件... 开始清理...", goViewProject.getProjectName(), fileList.size());
            for (SysFile sysFile : fileList) {
                fileStorageService.delete(sysFile.getUrl());
            }
        }
        log.debug("^_^ 多余的预览资源文件已经清理完成, 又有更多的空间啦~~");
    }
}
